﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

//Agregado para utilizar el DataTable.
using System.Data;

//Agregado para utilizar la base de datos.
using System.Data.SqlClient;
using System.Configuration;

/// <summary>
/// Clase controladora de bases de datos de requerimientos.
/// </summary>
public class CtrlBDRequerimientos
{
    String strConnect;
    String strSql;
    SqlConnection connection;
    SqlDataAdapter adapter;
    SqlCommand command;

    public CtrlBDRequerimientos()
    {
        strConnect = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString;
        connection = new SqlConnection(strConnect);
    }

    // Inserta un Requerimiento funcional en base de datos
    public int insertarRequerimientoFuncional(RequerimientoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();
        if (requerimiento.DependeDeR == -1)
        {
            strSql = "EXEC insertarRequerimientoFuncional @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion, NULL, @Dependencia";
        }
        else {
            strSql = "EXEC insertarRequerimientoFuncional @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion, @Dependencia, NULL";
        }
       
        command = new SqlCommand(strSql, connection);

        SqlParameter p2 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p3 = new SqlParameter("@iteracion", requerimiento.Iteracion);
        SqlParameter p4 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p5 = new SqlParameter("@prioridad", requerimiento.Prioridad);
        SqlParameter p6 = new SqlParameter("@estado", requerimiento.Estado);
        SqlParameter p7 = new SqlParameter("@fechaInicio", requerimiento.FechaInicio);
        SqlParameter p8 = new SqlParameter("@fuente", requerimiento.Fuente);
        SqlParameter p9 = new SqlParameter("@fechaFinal", requerimiento.FechaFinal);
        SqlParameter p10 = new SqlParameter("@esfuerzo", requerimiento.Esfuerzo);
        SqlParameter p11 = new SqlParameter("@criterioAceptacion", requerimiento.CriterioAceptacion);
        SqlParameter p12 = new SqlParameter("@justificacion", requerimiento.Justificacion);
        
        // Control sobre el indice negativo para evitar errores.
        SqlParameter p13; 
        if (requerimiento.DependeDeR == -1)
        {
            p13 = new SqlParameter("@Dependencia", requerimiento.DependeDeM);
        }
        else {
            p13 = new SqlParameter("@Dependencia", requerimiento.DependeDeR);
        }

        
        
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        command.Parameters.Add(p4);
        command.Parameters.Add(p5);
        command.Parameters.Add(p6);
        command.Parameters.Add(p7);
        command.Parameters.Add(p8);
        command.Parameters.Add(p9);
        command.Parameters.Add(p10);
        command.Parameters.Add(p11);
        command.Parameters.Add(p12);
        command.Parameters.Add(p13);

        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Retorna los requerimientos con los que 'id' no tiene conflictos
    public DataTable sinConflictos(int id)
    {
        DataTable requerimientos = new DataTable();

        connection.Open();
        strSql = "EXEC sinConflicto @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(requerimientos);
        connection.Close();

        return requerimientos;
    }
    
    //Retorna los requerimientos con los que 'id' tiene conflictos
    public DataTable conConflictos(int id)
    {
        DataTable conflictos = new DataTable();

        connection.Open();
        strSql = "EXEC conConflicto @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(conflictos);
        connection.Close();

        return conflictos;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /// Inserta un Requerimiento funcional en base de datos
    public int insertarRequerimientoNoFuncional(RequerimientoNoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC insertarRequerimientoNoFuncional @nombreRequerimiento, @descripcion, @dependeDeP";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p2 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p3 = new SqlParameter("@dependeDeP", requerimiento.DependeDeP);
        
        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        
        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    //Obtiene un dataset con las prioridades (nombre y id)
    public DataSet obtenerPrioridades()
    {
        DataSet dataSet = new DataSet();

        connection.Open();
        strSql = "SELECT Id, Prioridad FROM Prioridad";
        adapter = new SqlDataAdapter(strSql, connection);
        adapter.Fill(dataSet, "Prioridad");
        connection.Close();
        return dataSet;
    }

    //Obtiene un dataset con los estados (nombre y id)
    public DataSet obtenerEstados()
    {
        DataSet dataSet = new DataSet();
        connection.Close();
        connection.Open();
        strSql = "SELECT Id, Estado FROM Estado";
        adapter = new SqlDataAdapter(strSql, connection);
        adapter.Fill(dataSet, "Estado");
        connection.Close();
        return dataSet;
    }

    /// <summary>
    /// Elimina el requerimiento funcional de la base de datos
    /// </summary>
    /// <param name="requerimiento"></param>
    /// <returns></returns>
    public int eliminarRequerimientoFuncional(RequerimientoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC eliminarRequerimientoFuncional @id";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);

        command.Parameters.Add(p1);
        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    /// <summary>
    /// Elimina el requerimiento no funcional de la base de datos
    /// </summary>
    /// <param name="requerimiento"></param>
    /// <returns></returns>
    public int eliminarRequerimientoNoFuncional(RequerimientoNoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC eliminarRequerimientoNoFuncional @id";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);

        command.Parameters.Add(p1);
        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    /// <summary>
    /// Modifica un requerimiento funcional de la base de datos y determina si es o no nueva version y la guarda
    /// </summary>
    /// <param name="requerimiento"></param>
    /// <returns></returns>
    public int modificarRequerimientoFuncional(RequerimientoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();

        if (requerimiento.DependeDeR == -1)
        {
            strSql = "EXEC modificarRequerimientoFuncional @id, @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion, NULL, @Dependencia";
        }
        else
        {
            strSql = "EXEC modificarRequerimientoFuncional @id, @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion, @Dependencia, NULL";
        }
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);
        SqlParameter p2 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p3 = new SqlParameter("@iteracion", requerimiento.Iteracion);
        SqlParameter p4 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p5 = new SqlParameter("@prioridad", requerimiento.Prioridad);
        SqlParameter p6 = new SqlParameter("@estado", requerimiento.Estado);
        SqlParameter p7 = new SqlParameter("@fechaInicio", requerimiento.FechaInicio);
        SqlParameter p8 = new SqlParameter("@fuente", requerimiento.Fuente);
        SqlParameter p9 = new SqlParameter("@fechaFinal", requerimiento.FechaFinal);
        SqlParameter p10 = new SqlParameter("@esfuerzo", requerimiento.Esfuerzo);
        SqlParameter p11 = new SqlParameter("@criterioAceptacion", requerimiento.CriterioAceptacion);
        SqlParameter p12 = new SqlParameter("@justificacion", requerimiento.Justificacion);
       
        SqlParameter p13;
        if (requerimiento.DependeDeR == -1)
        {
            p13 = new SqlParameter("@Dependencia", requerimiento.DependeDeM);
        }
        else
        {
            p13 = new SqlParameter("@Dependencia", requerimiento.DependeDeR);
        }

        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        command.Parameters.Add(p4);
        command.Parameters.Add(p5);
        command.Parameters.Add(p6);
        command.Parameters.Add(p7);
        command.Parameters.Add(p8);
        command.Parameters.Add(p9);
        command.Parameters.Add(p10);
        command.Parameters.Add(p11);
        command.Parameters.Add(p12);
        command.Parameters.Add(p13);


        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    /// <summary>
    /// Modifica un requerimiento no funcional de la base de datos y determina si es o no nueva version y la guarda
    /// </summary>
    /// <param name="requerimiento"></param>
    /// <returns></returns>
    public int modificarRequerimientoNoFuncional(RequerimientoNoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC modificarRequerimientoNoFuncional @id, @nombreRequerimiento, @descripcion, @dependeDeP";
        //, @fechaCambio, @idFuenteCambio, @descripcionCambio";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);
        SqlParameter p2 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p3 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p4 = new SqlParameter("@DependeDeP", requerimiento.DependeDeP);
//        SqlParameter p5 = new SqlParameter("@fechaCambio", requerimiento.FechaCambio);
//        SqlParameter p6 = new SqlParameter("@idFuenteCambio", requerimiento.FuenteCambio);
//        SqlParameter p7 = new SqlParameter("@descripcionCambio", requerimiento.DescripcionCambio);

        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        command.Parameters.Add(p4);
//        command.Parameters.Add(p5);
//        command.Parameters.Add(p6);
//        command.Parameters.Add(p7);

        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    // Realiza una consulta en base de datos del requerimiento funcional
    public DataSet recuperarRF(int id)
    {
        DataSet requerimiento = new DataSet();

        connection.Open();
        strSql = "EXEC recuperarRF @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(requerimiento);
        connection.Close();

        return requerimiento;
    }

    // Realiza una consulta en base de datos del requerimiento no funcional
    public DataSet recuperarRNF(int id)
    {
        DataSet requerimiento = new DataSet();

        connection.Open();
        strSql = "EXEC recuperarRNF @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(requerimiento);
        connection.Close();

        return requerimiento;
    }

    //Obtiene un dataset con los modulos (nombre y id)
    public DataSet obtenerModulos(int proyecto)
    {
        DataSet modulos = new DataSet();

        connection.Open();
        strSql = "EXEC obtenerModulos @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", proyecto);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(modulos);
        connection.Close();

        return modulos;
    }

    //Obtiene un dataset con los requerimientos (nombre y id)
    public DataSet obtenerRequerimientos(int idModulo)
    {
        DataSet requerimientos = new DataSet();

        connection.Open();
        strSql = "EXEC RecuperarRFporModulo @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", idModulo);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(requerimientos);
        connection.Close();

        return requerimientos;
    }

    //Obtiene un dataset con los subrequerimientos asignados a un requerimiento (nombre y id)
    public DataSet obtenerSubrequerimientos(int requerimiento)
    {
        DataSet subrequerimientos = new DataSet();

        connection.Open();
        strSql = "EXEC obtenerSubrequerimientos @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", requerimiento);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(subrequerimientos);
        connection.Close();

        return subrequerimientos;
    }

    //Obtiene un dataset con los requerimientos no funcionales (nombre y id)
    public DataSet obtenerRequerimientosNoFuncionales(int idMod)
    {
        DataSet reqNoFuncionales = new DataSet();
        connection.Open();
        strSql = "EXEC RecuperarRNFporProy @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", idMod);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(reqNoFuncionales);
        connection.Close();

        return reqNoFuncionales;
    }

    // Agrega un modulo a la base de datos
    public int agregarModulo(int idProyecto, string nombre)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC InsertarModulo @nombre, @DependeDeP";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@nombre", nombre);
        SqlParameter p2 = new SqlParameter("@DependeDeP", idProyecto);

        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    // Elimina un modulo de la base de datos
    public int eliminarModulo(int idModulo)
    {
        int codigoResultado = -1;

        connection.Open();
        strSql = "EXEC eliminarModulo @id";
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", idModulo);

        command.Parameters.Add(p1);
        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }
	
	    // Obtiene el historial de versiones de un determinado Requerimiento
    public DataSet getHistorialRF(int id)
    {
        DataSet historial = new DataSet();
        connection.Open();
        strSql = "EXEC RecuperarHistorialRF @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(historial);
        connection.Close();

        return historial;
    }

    // Obtiene el historial de versiones de un determinado Requerimiento No Funcional
    public DataSet getHistorialRNF(int id)
    {
        DataSet historial = new DataSet();
        connection.Open();
        strSql = "EXEC RecuperarHistorialRNF @id";
        command = new SqlCommand(strSql, connection);
        SqlParameter p1 = new SqlParameter("@id", id);
        command.Parameters.Add(p1);
        adapter = new SqlDataAdapter(command);
        adapter.Fill(historial);
        connection.Close();

        return historial;
    }

    // Iserta una nueva version de requerimiento funcional
    public int newVersionRF(RequerimientoFuncional requerimiento) {

        int codigoResultado = -1;

        connection.Open();

        if (requerimiento.DependeDeR == -1)
        {
            //@id int,@Nombre varchar(80),@Iteracion int,@Descipcion varchar(250),@Prioridad int,@Estado varchar(15),@FechaInicio datetime,@Fuente int,@FechaFinal datetime,@EsfuerzoEstimado int,@CriterioDeAceptacion varchar(250),@Justificacion varchar (250),@FechaCambio datetime,@DescripcionCambio varchar(250),@FuenteCambio int,@DependeDeR int,@DependeDeM int
            strSql = "EXEC insertarNuevoRequerimientoFuncional @id, @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion,@fechaCambio,@descripcionCambio,@fuenteCambio, NULL, @Dependencia";
        }
        else
        {
            strSql = "EXEC insertarNuevoRequerimientoFuncional @id, @nombreRequerimiento, @iteracion, @descripcion, @prioridad, @estado, @fechaInicio, @fuente, @fechaFinal, @esfuerzo, @criterioAceptacion, @justificacion,@fechaCambio,@descripcionCambio,@fuenteCambio, @Dependencia, NULL";
        }
        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);
        SqlParameter p2 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p3 = new SqlParameter("@iteracion", requerimiento.Iteracion);
        SqlParameter p4 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p5 = new SqlParameter("@prioridad", requerimiento.Prioridad);
        SqlParameter p6 = new SqlParameter("@estado", requerimiento.Estado);
        SqlParameter p7 = new SqlParameter("@fechaInicio", requerimiento.FechaInicio);
        SqlParameter p8 = new SqlParameter("@fuente", requerimiento.Fuente);
        SqlParameter p9 = new SqlParameter("@fechaFinal", requerimiento.FechaFinal);
        SqlParameter p10 = new SqlParameter("@esfuerzo", requerimiento.Esfuerzo);
        SqlParameter p11 = new SqlParameter("@criterioAceptacion", requerimiento.CriterioAceptacion);
        SqlParameter p12 = new SqlParameter("@justificacion", requerimiento.Justificacion);
        SqlParameter p13 = new SqlParameter("@fechaCambio", requerimiento.FechaCambio);
        SqlParameter p14 = new SqlParameter("@descripcionCambio", requerimiento.DescripcionCambio);
        SqlParameter p15 = new SqlParameter("@fuenteCambio", requerimiento.FuenteCambio);
        SqlParameter p16;
        if (requerimiento.DependeDeR == -1)
        {
            p16 = new SqlParameter("@Dependencia", requerimiento.DependeDeM);
        }
        else
        {
            p16 = new SqlParameter("@Dependencia", requerimiento.DependeDeR);
        }

        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        command.Parameters.Add(p4);
        command.Parameters.Add(p5);
        command.Parameters.Add(p6);
        command.Parameters.Add(p7);
        command.Parameters.Add(p8);
        command.Parameters.Add(p9);
        command.Parameters.Add(p10);
        command.Parameters.Add(p11);
        command.Parameters.Add(p12);
        command.Parameters.Add(p13);
        command.Parameters.Add(p14);
        command.Parameters.Add(p15);
        command.Parameters.Add(p16);

        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }

    /// <summary>
    /// Modifica un requerimiento no funcional de la base de datos y determina si es o no nueva version y la guarda
    /// </summary>
    /// <param name="requerimiento"></param>
    /// <returns></returns>
    public int newVersionRNF(RequerimientoNoFuncional requerimiento)
    {
        int codigoResultado = -1;

        connection.Open();

        //	@id int,@Nombre varchar(20) ,@Descripcion varchar(250),@FechaCambio datetime,@DescripcionCambio varchar(250),@FuenteCambio int,@DependeDeP int
        strSql = "EXEC insertarNuevoRequerimientoNoFuncional @id, @nombreRequerimiento, @descripcion,@FechaCambio,@DescripcionCambio,@FuenteCambio, @dependeDeP";

        command = new SqlCommand(strSql, connection);

        SqlParameter p1 = new SqlParameter("@id", requerimiento.Id);
        SqlParameter p2 = new SqlParameter("@nombreRequerimiento", requerimiento.NombreRequerimiento);
        SqlParameter p3 = new SqlParameter("@descripcion", requerimiento.Descripcion);
        SqlParameter p4 = new SqlParameter("@FechaCambio", requerimiento.FechaCambio);
        SqlParameter p5 = new SqlParameter("@DescripcionCambio", requerimiento.DescripcionCambio);
        SqlParameter p6 = new SqlParameter("@FuenteCambio", requerimiento.FuenteCambio);
        SqlParameter p7 = new SqlParameter("@DependeDeP", requerimiento.DependeDeP);

        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
        command.Parameters.Add(p3);
        command.Parameters.Add(p4);
        command.Parameters.Add(p5);
        command.Parameters.Add(p6);
        command.Parameters.Add(p7);

        command.ExecuteNonQuery();
        connection.Close();

        return codigoResultado;
    }
}